package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.entity.ExceptionRecord;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 异常处理服务接口
 * 提供异常记录、查询、处理、统计等功能
 */
public interface ExceptionHandlingService extends IService<ExceptionRecord> {

    /**
     * 记录异常信息
     * @param exception 异常对象
     * @param request 请求对象
     * @param operatorId 操作用户ID
     * @param operatorName 操作用户名
     * @return 记录结果
     */
    boolean recordException(Exception exception, HttpServletRequest request, Long operatorId, String operatorName);

    /**
     * 记录异常信息（带自定义参数）
     * @param exceptionType 异常类型
     * @param exceptionDesc 异常描述
     * @param occurLocation 发生地点
     * @param exceptionLevel 异常级别
     * @param stackTrace 异常堆栈
     * @param request 请求对象
     * @param operatorId 操作用户ID
     * @param operatorName 操作用户名
     * @return 记录结果
     */
    boolean recordException(String exceptionType, String exceptionDesc, String occurLocation,
                           Integer exceptionLevel, String stackTrace, HttpServletRequest request,
                           Long operatorId, String operatorName);

    /**
     * 分页查询异常记录
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param exceptionRecord 查询条件
     * @return 分页结果
     */
    IPage<ExceptionRecord> getExceptionRecordPage(Integer currentPage, Integer pageSize, ExceptionRecord exceptionRecord);

    /**
     * 根据ID查询异常记录详情
     * @param recordId 记录ID
     * @return 异常记录详情
     */
    ExceptionRecord getExceptionRecordById(Long recordId);

    /**
     * 处理异常记录
     * @param recordId 记录ID
     * @param handlerId 处理人ID
     * @param handlerName 处理人姓名
     * @param solution 解决方案
     * @return 处理结果
     */
    boolean handleExceptionRecord(Long recordId, Long handlerId, String handlerName, String solution);

    /**
     * 批量处理异常记录
     * @param recordIds 记录ID列表
     * @param handlerId 处理人ID
     * @param handlerName 处理人姓名
     * @param solution 解决方案
     * @return 处理结果
     */
    boolean batchHandleExceptionRecords(List<Long> recordIds, Long handlerId, String handlerName, String solution);

    /**
     * 忽略异常记录
     * @param recordId 记录ID
     * @param handlerId 处理人ID
     * @param handlerName 处理人姓名
     * @param reason 忽略原因
     * @return 处理结果
     */
    boolean ignoreExceptionRecord(Long recordId, Long handlerId, String handlerName, String reason);

    /**
     * 批量忽略异常记录
     * @param recordIds 记录ID列表
     * @param handlerId 处理人ID
     * @param handlerName 处理人姓名
     * @param reason 忽略原因
     * @return 处理结果
     */
    boolean batchIgnoreExceptionRecords(List<Long> recordIds, Long handlerId, String handlerName, String reason);

    /**
     * 异常统计分析
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    Map<String, Object> getExceptionStatistics(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按异常类型统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> getExceptionStatisticsByType(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按异常级别统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> getExceptionStatisticsByLevel(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按发生地点统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> getExceptionStatisticsByLocation(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按处理状态统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<Map<String, Object>> getExceptionStatisticsByStatus(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取异常趋势数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param interval 时间间隔：hour、day、week、month
     * @return 趋势数据
     */
    List<Map<String, Object>> getExceptionTrendData(LocalDateTime startTime, LocalDateTime endTime, String interval);

    /**
     * 生成异常报告
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param reportType 报告类型：daily、weekly、monthly
     * @return 报告数据
     */
    Map<String, Object> generateExceptionReport(LocalDateTime startTime, LocalDateTime endTime, String reportType);

    /**
     * 获取待处理的异常记录数量
     * @return 数量
     */
    long getPendingExceptionCount();

    /**
     * 获取严重级别的异常记录数量
     * @return 数量
     */
    long getSevereExceptionCount();

    /**
     * 获取最近异常记录
     * @param limit 限制数量
     * @return 异常记录列表
     */
    List<ExceptionRecord> getRecentExceptions(Integer limit);

    /**
     * 删除异常记录（逻辑删除）
     * @param recordId 记录ID
     * @return 删除结果
     */
    boolean deleteExceptionRecord(Long recordId);

    /**
     * 批量删除异常记录
     * @param recordIds 记录ID列表
     * @return 删除结果
     */
    boolean batchDeleteExceptionRecords(List<Long> recordIds);

    /**
     * 清理过期的异常记录
     * @param beforeTime 时间点
     * @return 清理数量
     */
    int cleanExpiredExceptionRecords(LocalDateTime beforeTime);

    /**
     * 自动判定异常级别
     * @param exception 异常对象
     * @param exceptionType 异常类型
     * @return 异常级别
     */
    Integer determineExceptionLevel(Exception exception, String exceptionType);

    /**
     * 获取异常处理建议
     * @param exceptionType 异常类型
     * @param exceptionDesc 异常描述
     * @return 处理建议
     */
    String getExceptionHandlingSuggestion(String exceptionType, String exceptionDesc);
}